Spring EL 也就是 Spring 表达式语言,支持在 xml 和注解中使用表达式,类似于 JSP 的 EL 表达式语言。
Spring 开发中我们可能经常涉及到调用各种资源的情况,包含普通文件、网址、配置文件、系统环境变量等,我们可以使用 Spring 的表达式语言实现资源的注入。
因为需要将 file 转换成字符串,我们增加 commons-io 可以简化文件的相关操作。
build.gradle
中增加1
compile group: 'commons-io', name: 'commons-io', version: '2.5'
resource 目录下新建
test.txt
,内容随意。resource 目录下新建新建
test.properties
文件,内容如下:1
project.name=SpringEL
需要被注入的 bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.springel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
public class DemoService {
"DemoService类的属性")//注入字符串 (
private String another;
public String getAnother() {
return another;
}
public void setAnother(String another) {
this.another = another;
}
}配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65package com.springel;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import java.io.IOException;
"com.springel") (
"classpath:test.properties") (
public class ElConfig {
"I LOVE YOU!")//注入字符串 (
private String normal;
"#{systemProperties['os.name']}")//获取操作系统名 (
private String osName;
"#{ T(java.lang.Math).random() * 100.0 }")//注入表达式结果 (
private double randomNumber;
"#{demoService.another}")//注入其他Bean的属性 (
private String fromAnother;
"${project.name}")//注入配置文件 (
private String projectName;
"classpath:cn/hncu/p2_2_2SpringEL/test.txt") (
private Resource testFile;//注意这个Resource是:org.springframework.core.io.Resource;
//注入配置文件
private Environment environment;
"http://www.baidu.com")//注入网址资源 (
private Resource testUrl;
//注入配置文件
public static PropertySourcesPlaceholderConfigurer propertyConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
public void outputResource(){
try {
System.out.println("normal:"+normal);
System.out.println("osName:"+osName);
System.out.println("randomNumber:"+randomNumber);
System.out.println("fromAnother:"+fromAnother);
System.out.println("projectName:"+projectName);
System.out.println("测试文件:"+IOUtils.toString(testFile.getInputStream()));
System.out.println("配置文件project.author:"+environment.getProperty("project.author"));
System.out.println("网址资源:"+IOUtils.toString(testUrl.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
}注入配置配件需要使用
@PropertySource
指定文件地址,若使用@Value
注入,则要配置一个PropertySourcesPlaceholderConfigurer
的 Bean。 注意,@Value("${project.name}")
使用的是 “$” 而不是 “#”。运行类
1
2
3
4
5
6
7
8
9
10
11
12
13package com.springel;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ElConfig.class);
ElConfig resourceService = context.getBean(ElConfig.class);
resourceService.outputResource();
context.close();
}
}